package com.cetool.autocms.util;

import cn.hutool.core.bean.BeanUtil;
import com.cetool.autocms.enumeration.SystemExceptionEnum;
import com.cetool.autocms.exception.ServiceException;
import com.github.pagehelper.PageSerializable;

import java.util.List;
import java.util.stream.Collectors;

/**
 * bean集合拷贝工具类
 *
 * @author 端木超群
 * @date 2021/11/01
 */
public final class BeansUtil {
    /**
     * 私有化构造器
     */
    private BeansUtil(){
    }

    /**
     * 列表数据拷贝
     *
     * @author 端木超群
     * @date 2021/11/01
     * @param sourceList 源集合
     * @param clazz 目标类对象
     * @param <T1> 源集合泛型参数
     * @param <T2> 目标类泛型参数
     * @return 目标集合
     */
    public static <T1,T2>List<T2>listCopy(List<T1>sourceList,Class<T2> clazz){
        return sourceList.stream().map(source->{
            T2 target;
            try{
                target = clazz.getDeclaredConstructor().newInstance();
            }catch (Exception e){
                throw new ServiceException(SystemExceptionEnum.BEANS_COPY_EXCEPTION);
            }
            BeanUtil.copyProperties(source,target);
            return target;
        }).collect(Collectors.toList());
    }

    /**
     * Page对象拷贝
     *
     * @author 端木超群
     * @date 2021/11/01
     * @param sourcePage 源分页对象
     * @param clazz 目标类对象
     * @param <T1> 源集合泛型参数
     * @param <T2> 目标类泛型参数
     * @return 拷贝的分页对象
     */
    public static <T1,T2> PageSerializable<T2> pageCopy(PageSerializable<T1>sourcePage, Class <T2> clazz){
        List<T2> targetList = listCopy(sourcePage.getList(),clazz);
        PageSerializable<T2> targetPage = new PageSerializable<>();
        targetPage.setTotal(sourcePage.getTotal());
        targetPage.setList(targetList);
        return targetPage;
    }
}
